t = db.cursora;

function run(n, atomic) {
    if (!isNumber(n)) {
        print("n:");
        printjson(n);
        assert(isNumber(n), "cursora.js isNumber");
    }
    t.drop();

    var bulk = t.initializeUnorderedBulkOp();
    for (i = 0; i < n; i++)
        bulk.insert({_id: i});
    assert.writeOK(bulk.execute());

    print("cursora.js startParallelShell n:" + n + " atomic:" + atomic);
    join = startParallelShell("sleep(50);" + "db.cursora.remove({" +
                              (atomic ? "$atomic:true" : "") + "});");

    var start = null;
    var ex = null;
    var num = null;
    var end = null;
    try {
        start = new Date();
        num = t.find(function() {
            num = 2;
            for (var x = 0; x < 1000; x++)
                num += 2;
            return num > 0;
        })
                  .sort({_id: -1})
                  .itcount();
        end = new Date();
    } catch (e) {
        print("cursora.js FAIL " + e);
        join();
        throw e;
    }

    join();

    // print( "cursora.js num: " + num + " time:" + ( end.getTime() - start.getTime() ) )
    assert.eq(0, t.count(), "after remove: " + tojson(ex));
    // assert.lt( 0 , ex.nYields , "not enough yields : " + tojson( ex ) ); // TODO make this more
    // reliable so cen re-enable assert
    if (n == num)
        print("cursora.js warning: shouldn't have counted all  n: " + n + " num: " + num);
}

run(1500);
run(5000);
run(1500, true);
run(5000, true);
print("cursora.js SUCCESS");
